using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace Curriculum.Business.LectorMetadatos
{
	/// <summary>
	/// Summary description for LectorBase.
	/// </summary>
	public abstract class LectorBase
	{
		public LectorBase()
		{
			//
			// TODO: Add constructor logic here
			//
		}

		public TextReader GetTextReader(string path)
		{
			TextReader fs = TextReader.Null;
			
			if (File.Exists(path))
			{
				fs = new StreamReader(path);	
			}			
			
			return fs;
		}

		public TextWriter GetTextWriter(string path)
		{
			TextWriter fs;
			
			if (File.Exists(path))
			{
				fs = new StreamWriter(path);	
			}			
			else
			{
				fs = File.CreateText(path);
			}
			
			return fs;
		}

		public virtual void Escribir(object objetoSerializable, string nroVersion)
		{
			XmlSerializer serializador = CrearSerializador();

			TextWriter writer = new StreamWriter(GetPathDestino(nroVersion));
			
			serializador.Serialize(writer,objetoSerializable);

			writer.Close();
		}
		protected object GetXMLDeserealizado(string nroVersion)
		{
			// Declare an object variable of the type to be deserialized.
			object objetoDeserializado = null;

			XmlSerializer s = CrearSerializador();		
			
			string pathDestino = this.GetPathDestino(nroVersion);
			
			TextReader fs = GetTextReader(pathDestino);

			if (fs != TextReader.Null)
			{

				XmlReader reader = new XmlTextReader(fs);         				

				// Use the Deserialize method to restore the object's state.
				objetoDeserializado = s.Deserialize(reader);

				fs.Close();				
			}

			return objetoDeserializado;
		}

		
				
		/// <summary>
		/// Retorna el path sin el numero de version ni el nombre del archivo xml.
		/// </summary>
		/// <returns></returns>
		private string GetPathCorto()
		{			
			string pathDirectorioDeTrabajo = System.Configuration.ConfigurationSettings.AppSettings[Constants.APP_DIR_TRABAJO];
			string directorioMetadatos = System.Configuration.ConfigurationSettings.AppSettings[Constants.APP_DIR_METADATOS];
			
			string pathCorto = string.Format(@"{0}{1}", pathDirectorioDeTrabajo, directorioMetadatos);
			
			return pathCorto;
		}

		private string GetPathDestino(string nroVersion)
		{						
			return string.Format(@"{0}{1}\{2}", GetPathCorto(), nroVersion, GetNombreArchivoXML());
		}


		protected abstract XmlSerializer CrearSerializador();
		protected abstract string GetNombreArchivoXML();
	}
}
